Zipfile(一)
本文作者:胡 婧
文字编辑:宁刘莹
技术总编:张 邯
本文将介绍Python中对zip压缩包的处理方法,其中包括查看压缩包中包含的文件信息、将压缩包里的部分或全部文件解压缩至指定路径下以及将某路径下的文件添加至压缩包中。这需要用到Python中内置的zipfile模块。
首先导入zipfile模块:
In [1]: import zipfile
zipfile模块有两个类,分别为:zipfile.ZipFile以及zipfile.ZipInfo。
一、zipfile.ZipFile
1.压缩文件的读入
对于压缩文件的读取、编写以及添加可以使用以下方法:
zipfile.ZipFile(file[, mode[, compression[,allowZip64]]])
其中,file指要读取、编写或者添加的压缩文件的路径以及名称。
mode表示打开该压缩文件的方式(包括:“r”、“w”、“a”),默认为“r”。“r”表示读取该压缩文件,如果我们指定路径下没有该文件就会报错。在“r”模式下,只对文件进行读取,不能对文件进行添加或修改;“w”表示创建一份新的压缩文件,如果我们指定路径下已存在同名的压缩文件,则会将原来的压缩文件覆盖掉;“a”表示在原有压缩文件的基础上进行修改以及添加,如果指定的路径下没有该压缩文件则创建一个新的压缩文件。所以当我们想在原有压缩文件的基础上新压缩一些文件进去,只能使用“a”模式,因为使用“w”模式,会把原有的文件统统覆盖掉。
compression表示压缩方式,分别为: zipfile.ZIP_STORED 、zipfile.ZIP_DEFLATED、zipfile.ZIP_BZIP2以及zipfile.ZIP_LZMA,默认为zipfile.ZIP_STORED。这四种方式是压缩文件的四种方式,本文不做过多解释,通常情况下不需要设置。
当文件超过4GB时需要将allowZip64设置为True,但默认情况就是True,所以,通常也不需要设置。
这里需要注意的是,当我们对压缩文件进行读取、编写或是添加结束后,需要加上file.close()。完整程序如下:
In [1]: z=zipfile.ZipFile("D:/temp.zip",'r')
In [2]: print(z)
In [3]: z.close()
Out[3]: <zipfile.ZipFile filename='D:/temp.zip' mode='r'>
当然,这里也可以使用之前提到过的上下文管理器,与with结合,省去时刻需要小心是否关闭的烦恼。程序如下:
In [5]: with zipfile.ZipFile("D:/temp.zip",'r') as z:
print(z)
Out[5]: <zipfile.ZipFile filename='D:/temp.zip' mode='r'>
我们想得知压缩包里的具体内容则可以用到如下程序:
In [6]: z. infolist()
其中返回有压缩包内文件详细信息的列表,一个元素描述一个文件,各个信息的具体含义如下表:
可以看到,这个压缩包中共有三个文件,一个pdf文件、一个xlsx文件和一个docx文件,它们都使用deflate的压缩方式。
如果想知道zip文档内的相关信息,则使用如下命令:
In [7]: z.printdir()
Out[7]:
File Name Modified Size
Contemporaneous_verification_of_language_evidence_from_management_earnings_forecasts.pdf 2019-08-30 01:22:04 668784
timetable.xlsx 2019-08-30 01:22:04 15447
zipfile.docx 2019-08-30 01:22:04 48065
其中相关信息的具体含义如下表所示:
也可以只获得压缩文件内的文件名称列表:
In [8]: z.namelist()
Out[8]:
['Contemporaneous_verification_of_language_evidence_from_management_earnings_forecasts.pdf',
'timetable.xlsx',
'zipfile.docx']
使用open方法,可以返回压缩文件内的某一文件的信息列表:
In [9]: z.open('zipfile.docx','r')
Out[9]: <zipfile.ZipExtFile name='zipfile.docx' mode='r' compress_type=deflate>
同时,我们可以读取其中的指定文件,并获取该文件的二进制数据:
In [10]: z.read('zipfile.docx')
2.进行解压缩处理
当我们想对压缩文件中的某一个文件进行解压缩时,使用z.extract(),可以指定路径。程序如下:
In [11]: z.extract('zipfile.docx','D:/temp')
Out[11]: 'D:\\temp\\zipfile.docx'
如果我们想对压缩文件中的全部文件进行解压缩,则使用z.extractall(),同时也可以对某个指定文件进行解压,只需要在后面加上需要解压的文件名即可。程序如下:
In [12]: z.extractall('D:/temp') #后面可以加文件名,不加的话默认全部
同时需要注意的是,原来路径下存在的同名文件将会被覆盖掉。
3.将文件进行压缩处理
当我们想将文件压缩至指定压缩文件中时,则需用到如下方式,打开该压缩文件的方式应该为“w”或是“a”:
z.write(filename[, arcname[, compress_type]])
其中filename为需要进行压缩的文件路径及其名称,arcname为在压缩文件中该文件被命名的名称,compress_type为压缩方式(默认为zipfile.ZIP_STORED)。
In [13]: z=zipfile.ZipFile("D:/temp.zip",'a')
In [14]: z.write('D:/temp/temp.txt','temp.txt')
Out[14]: C:\Anaconda3\lib\zipfile.py:1349: UserWarning: Duplicate name: 'temp.txt'
return self._open_to_write(zinfo, force_zip64=force_zip64)
In [15]: z.close()
你还在用 “mkdir”+“cd”创建和切换路径吗?
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。